package com.liuguangzhou.utils;

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

import java.math.BigDecimal;
import java.math.BigInteger;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Calendar;
import java.util.Date;
import java.util.Map;

/**
 * Created by bianzhifu on 15/3/30.
 */
public class DateKit {
    private static Logger logger = LoggerFactory.getLogger(DateKit.class);
    //工作时间
    private static int WORK_HOUR_AM_START=9;
    private static int WORK_HOUR_AM_END=12;
    private static int WORK_HOUR_PM_START=13;
    private static int WORK_HOUR_PM_END=17;

    /**
     * 获取当前年
     * @return yyyy
     */
    public static String getTodayyyyy(){
        SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyy");
        return simpleDateFormat.format(new Date());
    }
    
    /**
     * 获取年
     * @return yyyy
     */
    public static String getTodayyyyyAdd(int num){
    	Calendar cal = Calendar.getInstance();
    	int year =cal.get(Calendar.YEAR)+1; 
    	cal.set(Calendar.YEAR,cal.get(Calendar.YEAR)+num);
    	Date date=cal.getTime();
        SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyy");
        return simpleDateFormat.format(date);
    }
    /**
     * 获取今天
     * @return yyyyMMdd
     */
    public static String getTodayyyyyMMdd(){
        SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyyMMdd");
        return simpleDateFormat.format(new Date());
    }
   
    /**
     * 获取今天
     * @return yyyy-MM-dd
     */
    public static String getNowTimeyyyy_mm_dd(){
        SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyy-MM-dd");
        return simpleDateFormat.format(new Date());
    }
    
    
    
	/**
	 * 对表示时间的字符串加时间
	 * @param ymd 表示时间的字符串
	 * @param num 增加的时间的数据
	 * @param unit 
	 * @return
	 */
	public static String add(String ymd,String patternFormat, int calendarField,int num) {
		try {
			SimpleDateFormat sdf = new SimpleDateFormat();
			sdf.applyPattern(patternFormat);
			Date date = sdf.parse(ymd);			
			Date date2 = add(date, calendarField,num);
			sdf.applyPattern(patternFormat);
			return sdf.format(date2);
		} catch (Exception e) {
			e.printStackTrace();
		}
		return null;
	}
	
	/**
	 * 对Date加时间
	 * @param date
	 * @param calendarField java.utils.Calendar 的常量
	 * @param num
	 * @return
	 */
	public static Date add(Date date,int calendarField,int num){
		Date result=null;
		if(date!=null){
			Calendar cal = getCalendar(date);
			cal.add(calendarField, num);			
			result = cal.getTime();
		}
		return result;
	}
	
	/**
	 * 由Date获取其对应的Calendar
	 * @param date
	 * @return
	 */
	public static Calendar getCalendar(Date date) {
		Calendar cal=Calendar.getInstance();
		cal.setTime(date);
		return cal;
	}
	
    
    /**
     * 获取当前时间
     * @return yyyy-MM-dd HH:mm:ss
     */
    public static String getNowTime(){
        SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
        return simpleDateFormat.format(new Date());
    }
    
    
    

    /**
     * 获取当前时间
     * @return yyyy-MM-dd HH:mm:ss
     */
    public static String getNowTime(String pattern){
        SimpleDateFormat simpleDateFormat = new SimpleDateFormat(pattern);
        return simpleDateFormat.format(new Date());
    }

    /**
     * 按传入的格式进行处理
     * @author LD   
     * @date 2016年6月15日 上午10:11:39  
     * @param date
     * @param pattern 格式化模版
     * @return String
     * @throws
     */
    public static String formatDateByPattern(Date date, String pattern){
    	if(pattern == null || "".equals(pattern)){
    		pattern = "yyyy-MM-dd HH:mm:ss";
    	}
    	SimpleDateFormat simpleDateFormat = new SimpleDateFormat(pattern);
    	return simpleDateFormat.format(date);
    }
    /**
     * 格式化时间yyyy-MM-dd HH:mm:ss
     * @param date
     * @return
     */
    public static String formatDateDefault(Date date){
        SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
        return simpleDateFormat.format(date);
    }
    /**
     * yyyy-MM-dd HH:mm:ss转换为时间格式
     * @param date
     * @return
     */
    public static Date parseDateDefault(String date){
        SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
        try {
            return simpleDateFormat.parse(date);
        } catch (ParseException e) {
            e.printStackTrace();
        }
        return null;
    }
    
    /**
     * yyyy-MM-dd转换为时间格式
     * @param date
     * @return
     */
    public static Date parseDateDefaultYMD(String date){
        SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyy-MM-dd");
        try {
            return simpleDateFormat.parse(date);
        } catch (ParseException e) {
            e.printStackTrace();
        }
        return null;
    }
    
    /**
     * 格式化时间yyyy-MM-dd
     * @param date
     * @return
     */
    public static String formatDateyyyyMMdd(Date date){
        SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyy-MM-dd");
        return simpleDateFormat.format(date);
    }

    /**
     * 获取工作时间
     * @param date
     * @return
     */
    public static Calendar get_work_start(Date date){
        Calendar calendar = Calendar.getInstance();
        calendar.setTime(date);
        calendar.set(Calendar.HOUR_OF_DAY, WORK_HOUR_AM_START);
        calendar.set(Calendar.MINUTE, 0);
        calendar.set(Calendar.SECOND, 0);
        return calendar;
    }
    public static Calendar get_work_end(Date date){
        Calendar calendar = Calendar.getInstance();
        calendar.setTime(date);
        calendar.set(Calendar.HOUR_OF_DAY, WORK_HOUR_PM_END);
        calendar.set(Calendar.MINUTE, 0);
        calendar.set(Calendar.SECOND, 0);
        return calendar;
    }

    /**
     * 返回时间差 单位毫秒
     * @param beginDate 开始时间
     * @param endDate 结束时间
     * @param days 开始时间到结束时间内的所有标识bean
     * @return
     */
    public static long getDateRange(Date beginDate,Date endDate,BeanMap days){

        long daterange=0;
        if(days == null){
            logger.error("getDateRange parms days is null");
            return daterange;
        }
        if(beginDate.getTime()>endDate.getTime()){
            logger.error("beginDate > endDate is error");
            return daterange;
        }
        Calendar day1_start=get_work_start(beginDate);
        Calendar day1_end=get_work_end(beginDate);
        Calendar day2_start=get_work_start(endDate);
        Calendar day2_end=get_work_end(endDate);
        System.out.println(formatDateDefault(beginDate));
        System.out.println(formatDateDefault(endDate));
        System.out.println("==============");
        Date s1=day1_start.getTime();
        Date s2=day1_end.getTime();
        System.out.println(formatDateDefault(s1));
        System.out.println(formatDateDefault(s2));
        System.out.println("==============");
        Date s3=day2_start.getTime();
        Date s4=day2_end.getTime();
        System.out.println(formatDateDefault(s3));
        System.out.println(formatDateDefault(s4));
        if(days.size()==1){
            //两个时间是同一天
            String daystate = days.getStringValue(formatDateyyyyMMdd(beginDate));
            if("holiday".equals(daystate)){
                //非工作日 return 0
                return daterange;
            }else{
                //工作日 是同一天 要计算时间
                long begin_longtime=beginDate.getTime();
                long end_longtime=endDate.getTime();
                if(end_longtime<day1_start.getTime().getTime()){
                    //结束时间小于工作时间开始时间 return 0
                    return daterange;
                }
                if(begin_longtime<=day1_start.getTime().getTime()){
                    //开始时间小于工作时间 开始时间等于工作时间
                    begin_longtime=day1_start.getTime().getTime();
                }
                if(begin_longtime>day1_end.getTime().getTime()){
                    //开始时间>工作时间 retunr 0
                    return daterange;
                }
                if(end_longtime>=day1_end.getTime().getTime()){
                    //结束时间 大于工作结束时间 结束时间等于工作结束时间
                    end_longtime = day1_end.getTime().getTime();
                }
                daterange = end_longtime-begin_longtime;
                return daterange;
            }
        }else{
            //不是同一天 要计算天数差
            long day1 = 0;
            long day2 = 0;
            String day1state = days.getStringValue(formatDateyyyyMMdd(beginDate));
            if("workday".equals(day1state)){
                if(beginDate.getTime()>day1_end.getTime().getTime()){
                    //开始时间已经过了工作时间则为0
                    day1=0;
                }else if(beginDate.getTime()<day1_start.getTime().getTime()){
                    //开始时间工作开始时间 则全天
                    day1 = day1_end.getTime().getTime()-day1_start.getTime().getTime();
                }else{
                    //用工作时间减去开始时间
                    day1 = day1_end.getTime().getTime()-beginDate.getTime();
                }
            }else{
                //非工作日为0
                day1 = 0;
            }

            String day2state = days.getStringValue(formatDateyyyyMMdd(endDate));
            if("workday".equals(day2state)){
                if(endDate.getTime()>day2_end.getTime().getTime()){
                    day2=day2_end.getTime().getTime()-day2_start.getTime().getTime();
                }else if(endDate.getTime()<day2_start.getTime().getTime()){
                    day2=0;
                }else{
                    day2=endDate.getTime()-day2_start.getTime().getTime();
                }
            }else{
                //非工作日为0
                day2 = 0;
            }

            //加上第一天跟最后一天
            daterange=daterange+day1;
            daterange=daterange+day2;
            //除了开始天跟结束天之外所有的工作日都算8小时
            for (Object o : days.entrySet()) {
                Map.Entry<String, String> entry = (Map.Entry<String, String>)o;
                if(!entry.getKey().equals(formatDateyyyyMMdd(beginDate)) && !entry.getKey().equals(formatDateyyyyMMdd(endDate))){
                    if("workday".equals(entry.getValue())){
                        daterange = daterange+(8*60*60*1000);
                    }
                }
            }
            return daterange;
        }
    }
    /**
     * 比较时间差是否相关1s
     * @author LD   
     * @date 2016年1月16日 下午10:34:05  
     * @param date
     * @param date1
     * @return boolean
     * @throws
     */
    public static boolean getTimeDifference(String date,String date1){
		SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
		long s = 0;
		try {
			s = sdf.parse(date).getTime() - sdf.parse(date1).getTime();
		} catch (ParseException e) {
			e.printStackTrace();
		}
		if(s > 1000){
			return true;
		}else{
			return false;
		}
	}
    
    
    /**
     * 比较时间差是否相关1s
     * @author LD   
     * @date 2016年1月16日 下午10:34:05  
     * @param date
     * @param date1
     * @return boolean
     * @throws
     */
    public static boolean getTimeDifferenceyyyy_mm_dd(String date,String date1){
		SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
		long s = 0;
		try {
			s = sdf.parse(date).getTime() - sdf.parse(date1).getTime();
		} catch (ParseException e) {
			e.printStackTrace();
		}
		if(s > 1000){
			return true;
		}else{
			return false;
		}
	}
    
    /**
     * 比较时间差
     * @author conyon
     * @date 2016年11月24日 下午17:34:05  
     * @param date 
     * @param date1
     * @return boolean
     * @throws
     */
    public static long getTimeDifference(String date,String date1,String pattern){
		SimpleDateFormat sdf = new SimpleDateFormat(pattern);
		long s = 0;
		try {
			s = sdf.parse(date).getTime() - sdf.parse(date1).getTime();
		} catch (ParseException e) {
			e.printStackTrace();
		}
		return s;
	}
    
    /**
     * <一句话功能简述>
     * <功能详细描述>
     * @author  cillin
     * @param format
     * @return
     * @see [类、类#方法、类#成员]
     */
    public static String getYestedayDate(String format)
    {        
        Calendar calendar = Calendar.getInstance();// 此时打印它获取的是系统当前时间
        calendar.add(Calendar.DATE, -1); // 得到前一天
        String yestedayDate = new SimpleDateFormat(format).format(calendar.getTime());
        return yestedayDate;
    }
    
	/**
	 * 获取当前月是哪个季度的
	 * 季度一年四季， 第一季度：1月-3月， 第二季度：4月-6月， 第三季度：7月-9月, 第四季度：10月-12月
	 * @param month  月份
	 * @return 第几个季度
	 */
	public static int getQuarterInMonth(int month){
	    return (month-1) / 3+1;
	}
	
	
	

	
	
	 public static BigDecimal getBigDecimal( Object value ) {  
	        BigDecimal ret = null;  
	        if( value != null ) {  
	            if( value instanceof BigDecimal ) {  
	                ret = (BigDecimal) value;  
	            } else if( value instanceof String ) {  
	                ret = new BigDecimal( (String) value );  
	            } else if( value instanceof BigInteger ) {  
	                ret = new BigDecimal( (BigInteger) value );  
	            } else if( value instanceof Number ) {  
	                ret = new BigDecimal( ((Number)value).doubleValue() );  
	            } else {  
	                throw new ClassCastException("Not possible to coerce ["+value+"] from class "+value.getClass()+" into a BigDecimal.");  
	            }  
	        }  
	        return ret;  
	    }

		/**
		 * 时间和季度是否有交叉
		 * @author conyon 
		 * @date 2019年3月21日 上午10:33:47
		 * @param startDate
		 * @param endDate
		 * @param quart 1：一季度 ，2：二季度 。。。
		 * @return
		 * @throws BpmException
		 */
		public static boolean isQuartHaveDate(String startDate, String endDate,
				int quart) throws BpmException{
			int StartMonth =  Integer.parseInt(startDate.substring(5, 7));
			int endMonth =  Integer.parseInt(endDate.substring(5, 7));
			
			int  StartQuartMonth =0;
			int  endQuartMonth =0;
			switch (quart){
			case 1 : StartQuartMonth = 1 ; 
					 endQuartMonth =3;
					 break;
			case 2 : StartQuartMonth = 4 ; 
			 		endQuartMonth =6;
			 break;
			 
			case 3 : StartQuartMonth = 7 ; 
					endQuartMonth =9;
			 break;
			 
			case 4 : StartQuartMonth = 10 ; 
					endQuartMonth =12;
			break;
			default:
				throw new BpmException("季度解析失败！DateKit.isQuartHaveDate Quart:"+quart);
			}
			
			if((StartMonth>=StartQuartMonth&&StartMonth<=endQuartMonth)
				||(endMonth>=StartQuartMonth&&endMonth<=endQuartMonth)
				||(StartMonth<= StartQuartMonth&&endMonth>=StartQuartMonth)){
				return true;
			}
			return false;
			
			
		}  
	
	

	
    public static void main(String[] args){
//        BeanMap map = new BeanMap();
//        map.put("2015-04-09","1");
//        map.put("2015-04-10","1");
//        map.put("2015-04-11","0");
//        map.put("2015-04-12","1");
//        Date time1 = parseDateDefault("2015-04-09 19:00:00");
//        Date time2 = parseDateDefault("2015-04-12 12:00:00");
//        long time = getDateRange(time1,time2,map);
//        System.out.println(DateKit.parseDateDefaultYMD("2014-10-12"));
//        for(int i = 1 ; i< 13;i++)
//        {
//            System.out.println(i+":"+getQuarterInMonth(i));
//        }
    	System.out.println(DateKit.add(DateKit.getNowTimeyyyy_mm_dd(), "yyyy-MM-dd", Calendar.DAY_OF_MONTH, 1));
        
    }
    
   
}
